package com.es.repository;

import com.es.dto.*;
import com.es.enums.EsMetricEnum;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;

import java.util.List;
import java.util.Map;

/**
 * @author 文雪峰
 * @date 2019/12/19 19:17
 * @description 简单描述
 **/
public interface EsApi<T> {
    /**
     * 保存
     * @param t 保存对象
     * @param index 索引名称
     * @param id id
     * @return 返回 true 成功 反则失败
     */
    boolean save(T t, String index, String id);

    /**
     * 批量保存
     * @param list 批量保存对象集合
     * @param index 索引名称
     * @param idList id集合
     * @return 返回 true 成功 反则失败
     */
    boolean batchSave(List<T> list, String index, List<String> idList);

    /**
     * 分页查询
     * @param queryBuilder 查询条件
     * @param pagePramDTO 分页查询参数
     * @return 返回对应集合
     */
    EsPageDTO<T> pageSearch(QueryBuilder queryBuilder, EsPageParamDTO<T> pagePramDTO);

    /**
     * 条件查询
     *
     * @author: wxf
     * @date: 2020/7/23 10:07
     * @param queryBuilder 查询条件
     * @param esSearchParamDto 查询参数
     * @return: {@link List<T>}
     **/
    List<T> search(QueryBuilder queryBuilder, EsSearchParamDTO<T> esSearchParamDto);

    /**
     * 获取根据id
     * @param id id
     * @param index 索引名称
     * @param clazz 转换对象
     * @return 返回对应对象
     */
    T getById(String id, String index, Class<T> clazz);

    /**
     * 获取根据id
     * @param id id
     * @param index 索引名称
     * @param clazz 转换对象
     * @param excludes 不包含的字段
     * @return 返回对应对象
     */
    T getById(String id, String index, Class<T> clazz, String[] excludes);

    /**
     * 获取集合根据id集合
     * @param idList
     * @param index 索引名称
     * @param clazz 转换对象
     * @return 返回对应对象集合
     */
    List<T> getListByIdList(List<String> idList, String index, Class<T> clazz);

    /**
     * 修改
     * @param t 修改对象
     * @param index 索引名称
     * @param id id
     * @return 返回 true 成功 反则失败
     */
    boolean update(T t, String index, String id);

    /**
     * 批量修改
     * @param t 修改对象集合
     * @param index 索引名称
     * @param idList id集合
     * @return {@link boolean}
     */
    boolean batchUpdate(List<T> t, String index, List<String> idList);

    /**
     * 删除根据id
     *
     * @author: wxf
     * @date: 2020/7/23 10:36id
     * @param id es文档id
     * @param index 索引名称
     * @return: {@link boolean}
     **/
    boolean deleteById(String id, String index);

    /**
     * 批量删除
     *
     * @author: wxf
     * @date: 2020/7/23 10:49
     * @param queryBuilder 查询条件
     * @param index 索引名称
     **/
    void batchDelete(BoolQueryBuilder queryBuilder, String index);

    /**
     * 经纬度查询
     *
     * @author: wxf
     * @date: 2020/7/22 18:10
     * @param queryBuilder 查询条件
     * @param esLocationParamDto  经纬度查询条件
     * @return: {@link EsPageDTO<T>}
     **/
    EsPageDTO<T> locationSearch(BoolQueryBuilder queryBuilder, EsLocationParamDTO<T> esLocationParamDto);

    /**
     * 聚合指标查询 求和、最小、最大、统计、平均
     * @auther: wxf
     * @date: 2020/10/18 13:46
     * @param queryBuilder 查询条件
     * @param esMetricParamDTO 指标查询参数
     * @return: {@link Double} 指标返回的是一个 double 值
     * es 指标返回格式
     * maxAge 对应 customName 的 自定义逻辑名称
     * "aggregations" : {
     *     "maxAge" : {
     *       "value" : 22.0
     *     }
     *   }
     */
    Double metricSearch(BoolQueryBuilder queryBuilder, EsMetricParamDTO esMetricParamDTO);

    /**
     * 聚合查询 对应 mysql 的 分组查询
     * @auther: wxf
     * @date: 2020/10/18 14:47
     * @param queryBuilder 查询条件
     * @param esAggsParamDTO 聚合查询参数
     * @return: {@link Map< String, String>}
     *
     */
    Map<String, String> aggsSearch(BoolQueryBuilder queryBuilder, EsAggsParamDTO esAggsParamDTO);

    /**
     * 高效前缀匹配搜索
     *
     * @author: wxf
     * @date: 2020/8/20 9:16
     * @param paramDTO 匹配参数
     * @return: {@link List< String>}
     **/
    List<String> completionSuggestSearch(EsCompletionSuggestParamDTO paramDTO);
}